/*
 * Copyright 2011 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.walkaround.wave.client;

import org.waveprotocol.wave.client.state.BlipReadStateMonitor;

/**
 * Forwards a wave's read state into a {@link ReadStateService}.
 *
 * @author hearnden@google.com (David Hearnden)
 */
public final class ReadStateSynchronizer implements BlipReadStateMonitor.Listener {
  private final ReadStateService target;
  private final BlipReadStateMonitor mon;

  /** The last state written. */
  private boolean wasRead;

  ReadStateSynchronizer(ReadStateService target, BlipReadStateMonitor mon) {
    this.target = target;
    this.mon = mon;
  }

  /** Creates a synchronizer, and starts pushing changes. */
  public static ReadStateSynchronizer create(ReadStateService target,
      BlipReadStateMonitor mon) {
    ReadStateSynchronizer synchronizer = new ReadStateSynchronizer(target, mon);
    synchronizer.init();
    return synchronizer;
  }

  private void init() {
    write(mon.getUnreadCount() == 0);
    mon.addListener(this);
  }

  /** Destroys this synchronizer, releasing its resources. */
  public void destroy() {
    mon.removeListener(this);
  }

  /** Writes the current read state. */
  private void write(boolean read) {
    target.setReadState(read);
    this.wasRead = read;
  }


  @Override
  public void onReadStateChanged() {
    boolean read = (mon.getUnreadCount() == 0);
    if (this.wasRead != read) {
      write(read);
    }
  }
}
